/*
 * Copyright (c) 2020.9，华乘电气科技有限公司
 * All rights reserved.
 *
 * 文件名称：infraredspectrum.h
 * 
 * 初始版本：1.0
 * 作者：洪澄
 * 创建日期：2020/09/03
 * 摘要：红外图谱
 * 当前版本：1.0
*/

#pragma once

#include "spectrum.h"
#include "infraredspectrumdefine.h"

namespace DataSpecificationGW
{
    class InfraredSpectrumPrivate;
    class DATASPECIFICATIONSHARED_EXPORT InfraredSpectrum : public Spectrum
    {
    public:
        InfraredSpectrum();
        ~InfraredSpectrum();

        /************************************************
         * 函数名   : setDataSpecificationVersion
         * 输入参数 :
           const DataSpecificationVersion eDataSpecificationVersion: 数据规范版本号
         * 输出参数 : NULL
         * 返回值   : void
         * 功能     : 设置数据规范版本号
         ************************************************/
        virtual void setDataSpecificationVersion(const DataSpecificationVersion eDataSpecificationVersion);

        /************************************************
         * 函数名   : spectrumName
         * 输入参数 : NULL
         * 输出参数 : NULL
         * 返回值   : QString
         * 功能     : 图谱名称
         ************************************************/
        virtual QString spectrumName() const;

        /************************************************
         * 函数名   : setInfraredExtInformation
         * 输入参数 :
           const InfraredExtInformation& stInfraredExtInformation: 红外ExtInformation
         * 输出参数 : NULL
         * 返回值   : void
         * 功能     : 设置红外ExtInformation
         ************************************************/
        void setInfraredExtInformation(const InfraredExtInformation& stInfraredExtInformation);

        /************************************************
         * 函数名   : setInfraredData
         * 输入参数 :
           const InfraredData& stInfraredData: 红外数据
         * 输出参数 : NULL
         * 返回值   : void
         * 功能     : 设置红外数据
         ************************************************/
        void setInfraredData(const InfraredData& stInfraredData);

        /************************************************
         * 函数名   : getInfraredExtInformation
         * 输入参数 : NULL
         * 输出参数 :
           InfraredExtInformation& stInfraredExtInformation: 红外ExtInformation
         * 返回值   : void
         * 功能     : 获取红外ExtInformation
         ************************************************/
        void getInfraredExtInformation(InfraredExtInformation& stInfraredExtInformation);

        /************************************************
         * 函数名   : getInfraredData
         * 输入参数 : NULL
         * 输出参数 :
           InfraredData& stInfraredData: 红外数据
         * 返回值   : void
         * 功能     : 获取红外数据
         ************************************************/
        void getInfraredData(InfraredData& stInfraredData);

    protected:

        /************************************************
         * 函数名   : saveBinarySpectrumExtInfo
         * 输入参数 :
           QDataStream& out: 输出流
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 保存二进制可扩展信息段
         ************************************************/
        virtual bool saveBinarySpectrumExtInfo(QDataStream& out);

        /************************************************
         * 函数名   : saveXMLSpectrumExtInfo
         * 输入参数 :
           XMLDocument& xmlDocumentObj: xml文档对象
           QDomElement& element: dom元素
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 保存XML可扩展信息段
         ************************************************/
        virtual bool saveXMLSpectrumExtInfo(XMLDocument& xmlDocumentObj, QDomElement& element);

        /************************************************
         * 函数名   : saveJSONSpectrumExtInfo
         * 输入参数 :
           rapidjson::Document::AllocatorType& alloc:
           rapidjson::Value& jsonValue: json数据
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 保存JSON可扩展信息段
         ************************************************/
        virtual bool saveJSONSpectrumExtInfo(rapidjson::Document::AllocatorType& alloc, rapidjson::Value& jsonValue);

        /************************************************
         * 函数名   : saveBinarySpectrumData
         * 输入参数 :
           QDataStream& out: 输出流
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 保存二进制图谱数据段
         ************************************************/
        virtual bool saveBinarySpectrumData(QDataStream& out);

        /************************************************
         * 函数名   : saveXMLSpectrumData
         * 输入参数 :
           XMLDocument& xmlDocumentObj: xml文档对象
           QDomElement& element: dom元素
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 保存XML图谱数据段
         ************************************************/
        virtual bool saveXMLSpectrumData(XMLDocument& xmlDocumentObj, QDomElement& element);

        /************************************************
         * 函数名   : saveJSONSpectrumData
         * 输入参数 :
           rapidjson::Document::AllocatorType& alloc:
           rapidjson::Value& jsonValue: json数据
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 保存JSON图谱数据段
         ************************************************/
        virtual bool saveJSONSpectrumData(rapidjson::Document::AllocatorType& alloc, rapidjson::Value& jsonValue);

        /************************************************
         * 函数名   : parseBinarySpectrumExtInfo
         * 输入参数 :
           QDataStream& in: 输入流
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 解析二进制可扩展信息段
         ************************************************/
        virtual bool parseBinarySpectrumExtInfo(QDataStream& in);

        /************************************************
         * 函数名   : parseXMLSpectrumExtInfo
         * 输入参数 :
           XMLDocument& xmlDocumentObj: xml文档对象
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 解析XML可扩展信息段
         ************************************************/
        virtual bool parseXMLSpectrumExtInfo(XMLDocument& xmlDocumentObj);

        /************************************************
         * 函数名   : parseJSONSpectrumExtInfo
         * 输入参数 :
           const rapidjson::Value& jsonValue: json数据
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 解析JSON可扩展信息段
         ************************************************/
        virtual bool parseJSONSpectrumExtInfo(const rapidjson::Value& jsonValue);

        /************************************************
         * 函数名   : parseBinarySpectrumData
         * 输入参数 :
           QDataStream& in: 输入流
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 解析二进制图谱数据段
         ************************************************/
        virtual bool parseBinarySpectrumData(QDataStream& in);

        /************************************************
         * 函数名   : parseXMLSpectrumData
         * 输入参数 :
           XMLDocument& xmlDocumentObj: xml文档对象
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 解析XML图谱数据段
         ************************************************/
        virtual bool parseXMLSpectrumData(XMLDocument& xmlDocumentObj);

        /************************************************
         * 函数名   : parseJSONSpectrumData
         * 输入参数 :
           const rapidjson::Value& jsonValue: json数据
         * 输出参数 : NULL
         * 返回值   : bool
         * 功能     : 解析JSON图谱数据段
         ************************************************/
        virtual bool parseJSONSpectrumData(const rapidjson::Value& jsonValue);

    private:
        inline int infraredTemperatureDataCount();

        inline int visibleLightPhotoDataCount();

        inline int infraredPhotoDataCount();

    private:
        InfraredSpectrumPrivate* m_pInfraredSpectrumPrivate{ Q_NULLPTR };
    };
}
